package com.jingdianjichi.subject.application.controller;


import com.jingdianjichi.subject.infra.rpc.util.LoginUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * 用户信息使用示例控制器
 * 
 * 该控制器展示了如何在业务代码中使用LoginUtil获取用户信息，
 * 包含了各种常见的使用场景和最佳实践。
 * 
 * 注意：这是一个示例控制器，主要用于演示和测试，
 * 生产环境中可以根据需要删除或修改。
 *
 * @author: CodeBuddy
 * @date: 2025/9/19
 */
@Slf4j
@RestController
@RequestMapping("/example")
public class UserInfoExampleController {

    /**
     * 获取当前用户信息示例
     * 展示基础的用户信息获取方法
     */
    @GetMapping("/current-user")
    public Map<String, Object> getCurrentUser() {
        Map<String, Object> result = new HashMap<>();
        
        try {
            // 方式1：获取用户ID（可能为null）
            String loginId = LoginUtil.getLoginId();
            log.info("当前登录用户ID: {} ", loginId);
            result.put("loginId", loginId);
            
            // 方式2：检查登录状态
            boolean isLogin = LoginUtil.isLogin();
            result.put("isLogin", isLogin);
            
            if (isLogin) {
                result.put("message", "用户已登录");
                log.info("用户{}访问当前用户信息接口", loginId);
            } else {
                result.put("message", "用户未登录");
                log.info("未登录用户访问当前用户信息接口");
            }
            
            result.put("success", true);
            
        } catch (Exception e) {
            result.put("success", false);
            result.put("error", e.getMessage());
            log.error("获取当前用户信息失败", e);
        }
        
        return result;
    }
    
    /**
     * 需要登录的接口示例
     * 展示如何处理必须登录的业务场景
     */
    @PostMapping("/protected-action")
    public Map<String, Object> protectedAction(@RequestBody Map<String, Object> requestData) {
        Map<String, Object> result = new HashMap<>();
        
        try {
            // 方式1：先检查再获取
            if (!LoginUtil.isLogin()) {
                result.put("success", false);
                result.put("message", "请先登录");
                return result;
            }
            
            String loginId = LoginUtil.getLoginId();
            
            // 业务逻辑处理
            log.info("用户{}执行受保护操作，数据：{}", loginId, requestData);
            
            result.put("success", true);
            result.put("message", "操作成功");
            result.put("loginId", loginId);
            result.put("data", requestData);
            
        } catch (Exception e) {
            result.put("success", false);
            result.put("error", e.getMessage());
            log.error("执行受保护操作失败", e);
        }
        
        return result;
    }
    
    /**
     * 强制要求登录的接口示例
     * 展示使用getLoginIdRequired()的场景
     */
    @PostMapping("/required-login-action")
    public Map<String, Object> requiredLoginAction(@RequestBody Map<String, Object> requestData) {
        Map<String, Object> result = new HashMap<>();
        
        try {
            // 方式2：直接获取，未登录会抛异常
            String loginId = LoginUtil.getLoginIdRequired();
            
            // 业务逻辑处理
            log.info("用户{}执行强制登录操作，数据：{}", loginId, requestData);
            
            result.put("success", true);
            result.put("message", "操作成功");
            result.put("loginId", loginId);
            result.put("data", requestData);
            
        } catch (RuntimeException e) {
            // 处理未登录异常
            result.put("success", false);
            result.put("message", e.getMessage());
            log.warn("用户未登录尝试访问强制登录接口");
        } catch (Exception e) {
            result.put("success", false);
            result.put("error", e.getMessage());
            log.error("执行强制登录操作失败", e);
        }
        
        return result;
    }
    
    /**
     * 可选登录的接口示例
     * 展示如何处理登录用户和未登录用户都可以访问的场景
     */
    @GetMapping("/optional-login-action")
    public Map<String, Object> optionalLoginAction() {
        Map<String, Object> result = new HashMap<>();
        
        try {
            // 方式3：获取用户ID或默认值
            String loginId = LoginUtil.getLoginIdOrDefault("anonymous");
            
            if ("anonymous".equals(loginId)) {
                // 未登录用户的处理逻辑
                result.put("message", "欢迎访问，您可以登录获得更好的体验");
                result.put("userType", "anonymous");
                log.info("匿名用户访问可选登录接口");
            } else {
                // 已登录用户的处理逻辑
                result.put("message", "欢迎回来，" + loginId);
                result.put("userType", "registered");
                log.info("用户{}访问可选登录接口", loginId);
            }
            
            result.put("success", true);
            result.put("loginId", loginId);
            
        } catch (Exception e) {
            result.put("success", false);
            result.put("error", e.getMessage());
            log.error("执行可选登录操作失败", e);
        }
        
        return result;
    }
    
    /**
     * 测试ThreadLocal清理的接口
     * 用于验证拦截器是否正确清理了ThreadLocal
     */
    @GetMapping("/test-cleanup")
    public Map<String, Object> testCleanup() {
        Map<String, Object> result = new HashMap<>();
        
        // 这个接口应该能正常获取用户信息
        String loginId = LoginUtil.getLoginId();
        result.put("loginId", loginId);
        result.put("isLogin", LoginUtil.isLogin());
        result.put("message", "ThreadLocal清理测试");
        result.put("success", true);
        
        log.info("ThreadLocal清理测试，当前用户：{}", loginId);
        
        return result;
    }
}